#include <pthread.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <unistd.h>
#include <string>
#include "lockGuard.hpp"
#include "Thread.hpp"

using namespace std;

// class TDate
// {
// public:
//     //构造
//     TDate(const char* tname, pthread_mutex_t *mutex)
//         :_tname(tname),
//         _mutex(mutex)
//         {}

//     ~TDate(){}

// public:
//     string _tname;
//     pthread_mutex_t *_mutex;
// };

// int tickets = 1000;
//  pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; //定义全局的互斥锁

// void *threadRoutine(void *arg)
// {
//     //TDate* td = static_cast<TDate*>(arg);//类型转换+构造
//     string message  = static_cast<const char*>(arg);

//     while(true)
//     {
//         //利用RAII思想
//         lockGuard lockguard(&mutex);

//         if(tickets > 0)
//         {
//             //模仿抢票时间
//             usleep(2000);//usleep：微秒(秒、毫秒、微秒、纳秒)
//             cout << message << " get a ticket: " << tickets-- << endl;
//         }
//         else
//         {
//             break;
//         }

// 将票数（共享资源）,上锁保护
// pthread_mutex_lock(td->_mutex);

// //利用RAII思想

// if(tickets > 0)
// {
//     //模仿抢票时间
//     usleep(2000);//usleep：微秒(秒、毫秒、微秒、纳秒)
//     cout << message << " get a ticket: " << tickets-- << endl;

//     //抢票成功，执行解锁操作
//     //pthread_mutex_unlock(td->_mutex);
// }
// else
// {
//    // pthread_mutex_unlock(td->_mutex);   //先解锁再跳出循环
//     break;
// }
//     }
// }

// 测试不同线程能不能释放一个线程申请的锁资源
// pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

// void *threadRoutine(void *arg)
// {
//     cout << "I am a new thread " << endl;

//     pthread_mutex_lock(&mutex);
//     cout << "I got a mutex!" << endl;

//     // 再次申请锁会发生阻塞
//     pthread_mutex_lock(&mutex);
//     cout << "I alive again" << endl;

//     return nullptr;
// }

// int main()
// {
//     pthread_t t1;
//     int n = pthread_create(&t1, nullptr, threadRoutine, nullptr);
//     if (n != 0)
//         exit(1);
//     sleep(3);

//     // 主线程
//     cout << "main thread run begin" << endl;
//     pthread_mutex_unlock(&mutex); //主线程释放锁
//     cout << "main thread unlock..." << endl;

//     sleep(3);
//     return 0;
// }

// int main()
// {
//     Thread t1(1, threadRoutine, (void*)"hello world");
//     Thread t2(2, threadRoutine, (void*)"hello world");
//     Thread t3(3, threadRoutine, (void*)"hello world");
//     Thread t4(4, threadRoutine, (void*)"hello world");

//     t1.run();
//     t2.run();
//     t3.run();
//     t4.run();

//     t1.join();
//     t2.join();
//     t3.join();
//     t4.join();

//     return 0;
// }

// int main()
// {
//     //定义互斥锁对象
//     pthread_mutex_t mutex;
//     //初始化互斥锁
//     pthread_mutex_init(&mutex, nullptr);

//     //创建4个子线程
//     pthread_t t[4];
//     int n = sizeof(t) / sizeof(t[0]);
//     for(int i = 0; i < n; i++)
//     {
//         char tname[64] = { 0 };
//         snprintf(tname, sizeof(char)*64, "thread -> %d", i + 1);
//         TDate* td = new TDate(tname, &mutex);

//         pthread_create(t + i, nullptr, threadRoutine, td);
//     }

//     //等待线程
//     for(int i = 0; i < n; i++)
//     {
//         pthread_join(t[i], nullptr);
//     }

//     //销毁互斥锁
//     pthread_mutex_destroy(&mutex);

//     return 0;
// }

// void threadHeadle(void *args)
// {
//     std::string message = static_cast<const char *>(args);
//     int cnt = 10;
//     while (cnt)
//     {
//         cout << "我是一个线程, " << message << ", cnt: " << cnt-- << endl;
//         sleep(1);
//     }
// }

// int main()
// {
// Thread t1(1, threadHeadle, (void *)"hello world");
// Thread t2(2, threadHeadle, (void *)"hello world");
// cout << "thread name: " << t1.threadname() << " thread id: " << t1.threadid() << ",thread status: " << t1.status() << std::endl;
// cout << "thread name: " << t2.threadname() << " thread id: " << t2.threadid() << ",thread status: " << t2.status() << std::endl;

// t1.run();
// t2.run();
// cout << "thread name: " << t1.threadname() << " thread id: " << t1.threadid() << ",thread status: " << t1.status() << std::endl;
// cout << "thread name: " << t2.threadname() << " thread id: " << t2.threadid() << ",thread status: " << t2.status() << std::endl;

// t1.join();
// t2.join();
// cout << "thread name: " << t1.threadname() << " thread id: " << t1.threadid() << ",thread status: " << t1.status() << std::endl;
// cout << "thread name: " << t2.threadname() << " thread id: " << t2.threadid() << ",thread status: " << t2.status() << std::endl;

//     return 0;
// }

// void* threadRoution(void* arg)
// {
//     //将调用的线程分离开来
//     pthread_detach(pthread_self());

//     const char* tname = static_cast<const char*>(arg);

//     int cnt = 5;

//     while(cnt)
//     {
//         cout << tname << ":" << cnt-- << endl;
//         sleep(1);
//     }

//     return nullptr;
// }

// int main()
// {
//     //创建线程
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadRoution, (void*)"thread 1");

//     //对子线程进行分离操作
//     // pthread_detach(tid);

//     sleep(1);

//     //等待线程
//     // void* ret = nullptr;
//     // int n = pthread_join(tid, &ret);
//     int n = pthread_join(tid, nullptr);
//     if(n != 0) cerr << "error:" << errno << strerror(n) << endl;

//     return 0;
// }